package cn.dujc.superkid.api;

import android.content.Context;

import java.util.Set;
import java.util.TreeMap;

import cn.dujc.superkid.utils.MD5Util;
import cn.dujc.superkid.utils.Preferences;

/**
 * 感觉每次拼接token有点麻烦，干脆所有参数都用map存放，然后统一使用这个生成token
 * 自动添加time
 * treemap遍历时会自动按照ascii升序排列
 *
 * @author du
 * date 2018/7/28 下午2:10
 */
public class QMap extends TreeMap<String, Object> {

    /**
     * QMap构造器，这样能够保证time和token一定会在合适时机加入
     */
    public static class Builder {
        private final QMap mMap;

        private Builder() {
            mMap = new QMap();
        }

        public Builder set(String key, Object val) {
            return put(key, val);
        }

        public Builder put(String key, Object val) {
            mMap.put(key, val);
            return this;
        }

        public Builder login(Context context){
            mMap.put("logincode", Preferences.getInstance().getLoginResult(context).getLogincode());
            return this;
        }

        public QMap create() {
            return mMap.withToken();
        }
    }

    /**
     * 私有的QMap构造方法，使构造QMap只能通过{@link #build()}创建一个QMap.Builder构造器来构造
     */
    private QMap() {
        put("time", System.currentTimeMillis() / 1000);
    }

    public static QMap.Builder build() {
        return new QMap.Builder();
    }

    public QMap withToken() {
        put("token", generateToken());
        return this;
    }

    public final String generateToken() {
        final StringBuilder builder = new StringBuilder();
        final Set<String> keys = keySet();
        for (String key : keys) {
            if (!"token".equalsIgnoreCase(key)) {
                builder.append(get(key));
            }
        }
        return MD5Util.encrypt("api_" + MD5Util.encrypt(builder.toString()) + "_api");
    }

    /**
     * 不建议直接使用QMap的put方法，建议先{@link #build()}得到一个{@link Builder}构造器<br/>
     * 再使用{@link Builder#put(String, Object)}或{@link Builder#set(String, Object)}<br/>
     * 最后再使用{@link Builder#create()}构造一个QMap
     */
    @Deprecated
    @Override
    public final Object put(String key, Object value) {
        return super.put(key, value);
    }

}